package dp;

/**
 * 编辑距离
 * 示例 1:
 * 输入: word1 = "horse", word2 = "ros"
 * 输出: 3
 * 解释:
 * horse -> rorse (将 'h' 替换为 'r')
 * rorse -> rose (删除 'r')
 * rose -> ros (删除 'e')
 *  dp[i] [j]的含义为：当字符串 word1 的长度为 i，字符串 word2 的长度为 j 时，将 word1 转化为 word2 所使用的最少操作次数为 dp[i] [j]。
 */
public class EditDistance {

    public static void main(String[] args) {
        int count = getMinOperateCount("horse", "ros");
        System.out.println("最少的操作次数是"+count);
    }

    public static int getMinOperateCount(String word1,String word2) {
        if (word1 == null || word2 == null) {
            return 0;
        }
        // 当字符串 word1 的长度为 i，字符串 word2 的长度为 j 时，将 word1 转化为 word2 所使用的最少操作次数为 dp[i] [j]
        int[][] dp = new int[word1.length()+1][word2.length()+1];
        /**
         * 如果 word1[i-1] == word2[j-1]，则不需要任何操作，因此 dp[i][j] = dp[i-1][j-1]；
         * 如果 word1[i-1] != word2[j-1]，则我们需要通过三种操作中的一种来达到目标状态：
         * 删除：dp[i][j] = dp[i-1][j] + 1
         * 插入：dp[i][j] = dp[i][j-1] + 1
         * 替换：dp[i][j] = dp[i-1][j-1] + 1
         */
        for (int i = 1; i < word1.length(); i++) {
            for (int j = 1; j < word2.length(); j++) {
                if (word1.charAt(i-1) == word2.charAt(j-1)) {
                    dp[i][j] = dp[i-1][j-1];
                } else {
                    dp[i][j] = Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1])) + 1;
                }
            }
        }
        return dp[word1.length()][word2.length()];
    }
}
